跳到主要内容

Git 合并冲突

如何将两个分支合并到一起。就是说我们新建一个分支,在其上开发某个新功能,开发完成后再合并回主线。

e.g

# 本地处理冲突: 
git fetch --all
git checkout temp-8f4fafc9-f-20220425-gcmxgz-test
git pull
git merge origin/test
# 处理冲突
git commit -am "fix: 解决冲突"
git push

检查冲突

git diff --check

merge 合并原理

合并的第一种方法 git merge。在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。

这里准备了两个分支,每个分支上各有一个独有的提交。这意味着没有一个分支包含了我们修改的所有内容。咱们通过合并这两个分支来解决这个问题。

我们要把 bugFix 合并到 master

首先,master 现在指向了一个拥有两个父节点的提交记录。假如从 master 开始沿着箭头向上看,在到达起点的路上会经过所有的提交记录。这意味着 master 包含了对代码库的所有修改。

这时再把 master 分支合并到 bugFix

因为 master 继承自 bugFix,Git 什么都不用做,只是简单地把 bugFix 移动到 master 所指向的那个提交记录。这表明每一个分支都包含了代码库的所有修改!

merge 合并流程

  1. 创建新分支 bugFix

  2. git checkout bugFix 命令切换到该分支

  3. 提交一次

  4. git checkout master 切换回 master

  5. 再提交一次

  6. git mergebugFix 合并到 master

git checkout -b bugFix
git commit
git checkout master
git commit
git merge bugFix

Rebase 合并原理

第二种合并分支的方法是 git rebase。Rebase 实际上就是取出一系列的提交记录,“复制” 它们,然后在另外一个地方逐个的放下去。

还是准备了两个分支;注意当前所在的分支是 bugFix(星号标识的是当前分支)

我们想要把 bugFix 分支里的工作直接移到 master 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。

这里使用 git rebase 之后

# 注意这里的顺序不要反了,这里是 master 与 bugFix 合并的意思
# 一般就是旧的合并新的
git rebase master bugFix

# 但是也可以反过来,那就变成 master 分支在 bugFix 下面了
git rebase master bugFix

# 在第一条命令的基础上执行
git rebase master bugFix
# 可以让 master 分支也移动到 c3' 节点

现在 bugFix 分支上的工作在 master 的最顶端,同时我们也得到了一个更线性的提交序列。

注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 master 分支上的 C3 的副本。

现在我们切换到了 master 上然后把它 rebasebugFix

由于 bugFix 继承自 master,所以 Git 只是简单的把 master 分支的引用向前移动了一下而已。

Rebase 合并流程

  1. 新建并切换到 bugFix 分支
  2. 提交一次
  3. 切换回 master 分支再提交一次
  4. 再次切换到 bugFix 分支,rebase 到 master